@effect/platform 0.58.20 → 0.58.22

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 (151) hide show
  1. package/dist/cjs/Command.js +3 -26
  2. package/dist/cjs/Command.js.map +1 -1
  3. package/dist/cjs/CommandExecutor.js +3 -26
  4. package/dist/cjs/CommandExecutor.js.map +1 -1
  5. package/dist/cjs/Cookies.js +11 -34
  6. package/dist/cjs/Cookies.js.map +1 -1
  7. package/dist/cjs/Effectify.js +3 -26
  8. package/dist/cjs/Effectify.js.map +1 -1
  9. package/dist/cjs/Error.js +5 -28
  10. package/dist/cjs/Error.js.map +1 -1
  11. package/dist/cjs/Etag.js +3 -26
  12. package/dist/cjs/Etag.js.map +1 -1
  13. package/dist/cjs/FileSystem.js +6 -29
  14. package/dist/cjs/FileSystem.js.map +1 -1
  15. package/dist/cjs/Headers.js +10 -33
  16. package/dist/cjs/Headers.js.map +1 -1
  17. package/dist/cjs/HttpApp.js +33 -89
  18. package/dist/cjs/HttpApp.js.map +1 -1
  19. package/dist/cjs/HttpBody.js +4 -27
  20. package/dist/cjs/HttpBody.js.map +1 -1
  21. package/dist/cjs/HttpClient.js +3 -26
  22. package/dist/cjs/HttpClient.js.map +1 -1
  23. package/dist/cjs/HttpClientError.js +4 -27
  24. package/dist/cjs/HttpClientError.js.map +1 -1
  25. package/dist/cjs/HttpClientRequest.js +3 -26
  26. package/dist/cjs/HttpClientRequest.js.map +1 -1
  27. package/dist/cjs/HttpClientResponse.js +4 -27
  28. package/dist/cjs/HttpClientResponse.js.map +1 -1
  29. package/dist/cjs/HttpIncomingMessage.js +9 -32
  30. package/dist/cjs/HttpIncomingMessage.js.map +1 -1
  31. package/dist/cjs/HttpMiddleware.js +3 -26
  32. package/dist/cjs/HttpMiddleware.js.map +1 -1
  33. package/dist/cjs/HttpMultiplex.js +3 -26
  34. package/dist/cjs/HttpMultiplex.js.map +1 -1
  35. package/dist/cjs/HttpPlatform.js +3 -26
  36. package/dist/cjs/HttpPlatform.js.map +1 -1
  37. package/dist/cjs/HttpRouter.js +3 -26
  38. package/dist/cjs/HttpRouter.js.map +1 -1
  39. package/dist/cjs/HttpServer.js +3 -26
  40. package/dist/cjs/HttpServer.js.map +1 -1
  41. package/dist/cjs/HttpServerError.js +9 -32
  42. package/dist/cjs/HttpServerError.js.map +1 -1
  43. package/dist/cjs/HttpServerRequest.js +4 -27
  44. package/dist/cjs/HttpServerRequest.js.map +1 -1
  45. package/dist/cjs/HttpServerRespondable.js +12 -42
  46. package/dist/cjs/HttpServerRespondable.js.map +1 -1
  47. package/dist/cjs/HttpServerResponse.js +3 -26
  48. package/dist/cjs/HttpServerResponse.js.map +1 -1
  49. package/dist/cjs/HttpTraceContext.js +5 -28
  50. package/dist/cjs/HttpTraceContext.js.map +1 -1
  51. package/dist/cjs/KeyValueStore.js +3 -26
  52. package/dist/cjs/KeyValueStore.js.map +1 -1
  53. package/dist/cjs/Multipart.js +3 -26
  54. package/dist/cjs/Multipart.js.map +1 -1
  55. package/dist/cjs/Path.js +3 -26
  56. package/dist/cjs/Path.js.map +1 -1
  57. package/dist/cjs/PlatformConfigProvider.js +16 -39
  58. package/dist/cjs/PlatformConfigProvider.js.map +1 -1
  59. package/dist/cjs/PlatformLogger.js +3 -26
  60. package/dist/cjs/PlatformLogger.js.map +1 -1
  61. package/dist/cjs/Runtime.js +4 -27
  62. package/dist/cjs/Runtime.js.map +1 -1
  63. package/dist/cjs/Socket.js +18 -41
  64. package/dist/cjs/Socket.js.map +1 -1
  65. package/dist/cjs/Template.js +6 -29
  66. package/dist/cjs/Template.js.map +1 -1
  67. package/dist/cjs/Terminal.js +4 -27
  68. package/dist/cjs/Terminal.js.map +1 -1
  69. package/dist/cjs/Transferable.js +8 -31
  70. package/dist/cjs/Transferable.js.map +1 -1
  71. package/dist/cjs/UrlParams.js +7 -30
  72. package/dist/cjs/UrlParams.js.map +1 -1
  73. package/dist/cjs/Worker.js +3 -26
  74. package/dist/cjs/Worker.js.map +1 -1
  75. package/dist/cjs/WorkerError.js +5 -28
  76. package/dist/cjs/WorkerError.js.map +1 -1
  77. package/dist/cjs/WorkerRunner.js +3 -26
  78. package/dist/cjs/WorkerRunner.js.map +1 -1
  79. package/dist/cjs/index.js +42 -65
  80. package/dist/cjs/internal/command.js +11 -34
  81. package/dist/cjs/internal/command.js.map +1 -1
  82. package/dist/cjs/internal/commandExecutor.js +9 -32
  83. package/dist/cjs/internal/commandExecutor.js.map +1 -1
  84. package/dist/cjs/internal/effectify.js +3 -26
  85. package/dist/cjs/internal/effectify.js.map +1 -1
  86. package/dist/cjs/internal/error.js +3 -26
  87. package/dist/cjs/internal/error.js.map +1 -1
  88. package/dist/cjs/internal/etag.js +3 -26
  89. package/dist/cjs/internal/etag.js.map +1 -1
  90. package/dist/cjs/internal/fileSystem.js +12 -35
  91. package/dist/cjs/internal/fileSystem.js.map +1 -1
  92. package/dist/cjs/internal/httpBody.js +10 -33
  93. package/dist/cjs/internal/httpBody.js.map +1 -1
  94. package/dist/cjs/internal/httpClient.js +23 -46
  95. package/dist/cjs/internal/httpClient.js.map +1 -1
  96. package/dist/cjs/internal/httpClientRequest.js +11 -34
  97. package/dist/cjs/internal/httpClientRequest.js.map +1 -1
  98. package/dist/cjs/internal/httpClientResponse.js +13 -36
  99. package/dist/cjs/internal/httpClientResponse.js.map +1 -1
  100. package/dist/cjs/internal/httpMiddleware.js +16 -39
  101. package/dist/cjs/internal/httpMiddleware.js.map +1 -1
  102. package/dist/cjs/internal/httpMultiplex.js +9 -32
  103. package/dist/cjs/internal/httpMultiplex.js.map +1 -1
  104. package/dist/cjs/internal/httpPlatform.js +8 -31
  105. package/dist/cjs/internal/httpPlatform.js.map +1 -1
  106. package/dist/cjs/internal/httpRouter.js +18 -41
  107. package/dist/cjs/internal/httpRouter.js.map +1 -1
  108. package/dist/cjs/internal/httpServer.js +6 -29
  109. package/dist/cjs/internal/httpServer.js.map +1 -1
  110. package/dist/cjs/internal/httpServerError.js +59 -42
  111. package/dist/cjs/internal/httpServerError.js.map +1 -1
  112. package/dist/cjs/internal/httpServerRequest.js +16 -39
  113. package/dist/cjs/internal/httpServerRequest.js.map +1 -1
  114. package/dist/cjs/internal/httpServerResponse.js +13 -36
  115. package/dist/cjs/internal/httpServerResponse.js.map +1 -1
  116. package/dist/cjs/internal/keyValueStore.js +11 -34
  117. package/dist/cjs/internal/keyValueStore.js.map +1 -1
  118. package/dist/cjs/internal/multipart.js +20 -43
  119. package/dist/cjs/internal/multipart.js.map +1 -1
  120. package/dist/cjs/internal/path.js +9 -36
  121. package/dist/cjs/internal/path.js.map +1 -1
  122. package/dist/cjs/internal/platformLogger.js +6 -29
  123. package/dist/cjs/internal/platformLogger.js.map +1 -1
  124. package/dist/cjs/internal/terminal.js +1 -1
  125. package/dist/cjs/internal/terminal.js.map +1 -1
  126. package/dist/cjs/internal/worker.js +23 -46
  127. package/dist/cjs/internal/worker.js.map +1 -1
  128. package/dist/cjs/internal/workerRunner.js +20 -43
  129. package/dist/cjs/internal/workerRunner.js.map +1 -1
  130. package/dist/dts/HttpApp.d.ts +4 -5
  131. package/dist/dts/HttpApp.d.ts.map +1 -1
  132. package/dist/dts/HttpServerError.d.ts +3 -2
  133. package/dist/dts/HttpServerError.d.ts.map +1 -1
  134. package/dist/dts/HttpServerRespondable.d.ts +1 -6
  135. package/dist/dts/HttpServerRespondable.d.ts.map +1 -1
  136. package/dist/esm/HttpApp.js +17 -50
  137. package/dist/esm/HttpApp.js.map +1 -1
  138. package/dist/esm/HttpServerError.js +2 -2
  139. package/dist/esm/HttpServerError.js.map +1 -1
  140. package/dist/esm/HttpServerRespondable.js +5 -11
  141. package/dist/esm/HttpServerRespondable.js.map +1 -1
  142. package/dist/esm/internal/httpMiddleware.js +2 -2
  143. package/dist/esm/internal/httpMiddleware.js.map +1 -1
  144. package/dist/esm/internal/httpServerError.js +48 -8
  145. package/dist/esm/internal/httpServerError.js.map +1 -1
  146. package/package.json +3 -3
  147. package/src/HttpApp.ts +47 -60
  148. package/src/HttpServerError.ts +7 -3
  149. package/src/HttpServerRespondable.ts +6 -15
  150. package/src/internal/httpMiddleware.ts +2 -2
  151. package/src/internal/httpServerError.ts +44 -19
package/src/HttpApp.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import * as Cause from "effect/Cause"
5
4
  import * as Context from "effect/Context"
6
5
  import * as Effect from "effect/Effect"
7
6
  import * as Exit from "effect/Exit"
@@ -15,7 +14,6 @@ import * as Scope from "effect/Scope"
15
14
  import type { HttpMiddleware } from "./HttpMiddleware.js"
16
15
  import * as ServerError from "./HttpServerError.js"
17
16
  import * as ServerRequest from "./HttpServerRequest.js"
18
- import * as Respondable from "./HttpServerRespondable.js"
19
17
  import * as ServerResponse from "./HttpServerResponse.js"
20
18
  import * as internalMiddleware from "./internal/httpMiddleware.js"
21
19
 
@@ -37,49 +35,45 @@ export type Default<E = never, R = never> = HttpApp<ServerResponse.HttpServerRes
37
35
  * @since 1.0.0
38
36
  * @category combinators
39
37
  */
40
- export const toHandled = <E, R, _, RH>(
38
+ export const toHandled = <E, R, _, EH, RH>(
41
39
  self: Default<E, R>,
42
40
  handleResponse: (
43
41
  request: ServerRequest.HttpServerRequest,
44
- exit: Exit.Exit<ServerResponse.HttpServerResponse, E | ServerError.ResponseError>
45
- ) => Effect.Effect<_, never, RH>,
42
+ response: ServerResponse.HttpServerResponse
43
+ ) => Effect.Effect<_, EH, RH>,
46
44
  middleware?: HttpMiddleware | undefined
47
- ): Default<E | ServerError.ResponseError, Exclude<R | RH, Scope.Scope>> => {
45
+ ): Effect.Effect<void, never, Exclude<R | RH, Scope.Scope>> => {
48
46
  const responded = Effect.withFiberRuntime<
49
47
  ServerResponse.HttpServerResponse,
50
- E | ServerError.ResponseError,
48
+ E | EH | ServerError.ResponseError,
51
49
  R | RH | ServerRequest.HttpServerRequest
52
50
  >((fiber) => {
53
51
  const request = Context.unsafeGet(fiber.getFiberRef(FiberRef.currentContext), ServerRequest.HttpServerRequest)
54
- const preHandled = Effect.flatMap(self, (response) => {
52
+ const preprocessResponse = (response: ServerResponse.HttpServerResponse) => {
55
53
  const handler = fiber.getFiberRef(currentPreResponseHandlers)
56
54
  return handler._tag === "Some" ? handler.value(request, response) : Effect.succeed(response)
55
+ }
56
+ return Effect.matchCauseEffect(self, {
57
+ onFailure: (cause) =>
58
+ Effect.flatMap(ServerError.causeResponse(cause), ([response, cause]) =>
59
+ preprocessResponse(response).pipe(
60
+ Effect.flatMap((response) => handleResponse(request, response)),
61
+ Effect.zipRight(Effect.failCause(cause))
62
+ )),
63
+ onSuccess: (response) =>
64
+ Effect.tap(
65
+ preprocessResponse(response),
66
+ (response) => handleResponse(request, response)
67
+ )
57
68
  })
58
- return Effect.flatMap(
59
- Effect.exit(preHandled),
60
- (exit) => {
61
- if (exit._tag === "Failure") {
62
- const cause = exit.cause
63
- const thing = Cause.squash(exit.cause)
64
- if (ServerResponse.isServerResponse(thing)) {
65
- exit = Exit.succeed(thing)
66
- } else {
67
- return Effect.matchCauseEffect(Respondable.toResponseError(thing), {
68
- onFailure: (_) => Effect.zipRight(handleResponse(request, exit), exit),
69
- onSuccess: (response) =>
70
- Effect.zipRight(
71
- handleResponse(request, Exit.succeed(response)),
72
- Effect.failCause(Cause.sequential(cause, Cause.die(response)))
73
- )
74
- })
75
- }
76
- }
77
- return Effect.zipRight(handleResponse(request, exit), exit)
78
- }
79
- )
80
69
  })
81
70
  const withTracer = internalMiddleware.tracer(responded)
82
- return Effect.uninterruptible(Effect.scoped(middleware === undefined ? withTracer : middleware(withTracer)))
71
+ return Effect.uninterruptible(
72
+ Effect.catchAllCause(
73
+ Effect.scoped(middleware === undefined ? withTracer : middleware(withTracer)),
74
+ (_) => Effect.void
75
+ )
76
+ )
83
77
  }
84
78
 
85
79
  /**
@@ -144,39 +138,31 @@ export const withPreResponseHandler = dual<
144
138
  */
145
139
  export const toWebHandlerRuntime = <R>(runtime: Runtime.Runtime<R>) => {
146
140
  const run = Runtime.runFork(runtime)
147
- const resolveSymbol = Symbol()
148
- const rejectSymbol = Symbol()
149
- return <E>(self: Default<E, R | Scope.Scope>) => {
150
- const handled = Effect.scoped(toHandled(self, (request, exit) => {
151
- const webRequest = request.source as Request
152
- if (Exit.isSuccess(exit)) {
153
- ;(request as any)[resolveSymbol](ServerResponse.toWeb(exit.value, request.method === "HEAD"))
154
- } else if (Cause.isInterruptedOnly(exit.cause)) {
155
- ;(request as any)[resolveSymbol](new Response(null, { status: webRequest.signal.aborted ? 499 : 503 }))
156
- } else {
157
- ;(request as any)[rejectSymbol](Cause.pretty(exit.cause))
158
- }
159
- return Effect.void
160
- }))
161
- return (request: Request): Promise<Response> =>
162
- new Promise((resolve, reject) => {
163
- const req = ServerRequest.fromWeb(request)
164
- ;(req as any)[resolveSymbol] = resolve
165
- ;(req as any)[rejectSymbol] = reject
166
- const fiber = run(Effect.provideService(handled, ServerRequest.HttpServerRequest, req))
167
- request.signal.addEventListener("abort", () => {
168
- fiber.unsafeInterruptAsFork(ServerError.clientAbortFiberId)
169
- }, { once: true })
170
- })
171
- }
141
+ return <E>(self: Default<E, R | Scope.Scope>, middleware: HttpMiddleware | undefined) =>
142
+ (request: Request): Promise<Response> =>
143
+ new Promise((resolve) => {
144
+ const fiber = run(Effect.provideService(
145
+ toHandled(self, (request, response) => {
146
+ resolve(ServerResponse.toWeb(response, request.method === "HEAD"))
147
+ return Effect.void
148
+ }, middleware),
149
+ ServerRequest.HttpServerRequest,
150
+ ServerRequest.fromWeb(request)
151
+ ))
152
+ request.signal.addEventListener("abort", () => {
153
+ fiber.unsafeInterruptAsFork(ServerError.clientAbortFiberId)
154
+ }, { once: true })
155
+ })
172
156
  }
173
157
 
174
158
  /**
175
159
  * @since 1.0.0
176
160
  * @category conversions
177
161
  */
178
- export const toWebHandler: <E>(self: Default<E, Scope.Scope>) => (request: Request) => Promise<Response> =
179
- toWebHandlerRuntime(Runtime.defaultRuntime)
162
+ export const toWebHandler: <E>(
163
+ self: Default<E, Scope.Scope>,
164
+ middleware?: HttpMiddleware | undefined
165
+ ) => (request: Request) => Promise<Response> = toWebHandlerRuntime(Runtime.defaultRuntime)
180
166
 
181
167
  /**
182
168
  * @since 1.0.0
@@ -184,14 +170,15 @@ export const toWebHandler: <E>(self: Default<E, Scope.Scope>) => (request: Reque
184
170
  */
185
171
  export const toWebHandlerLayer = <E, R, RE>(
186
172
  self: Default<E, R | Scope.Scope>,
187
- layer: Layer.Layer<R, RE>
173
+ layer: Layer.Layer<R, RE>,
174
+ middleware?: HttpMiddleware | undefined
188
175
  ): {
189
176
  readonly close: () => Promise<void>
190
177
  readonly handler: (request: Request) => Promise<Response>
191
178
  } => {
192
179
  const scope = Effect.runSync(Scope.make())
193
180
  const close = () => Effect.runPromise(Scope.close(scope, Exit.void))
194
- const build = Effect.map(Layer.toRuntime(layer), (_) => toWebHandlerRuntime(_)(self))
181
+ const build = Effect.map(Layer.toRuntime(layer), (_) => toWebHandlerRuntime(_)(self, middleware))
195
182
  const runner = Effect.runPromise(Scope.extend(build, scope))
196
183
  const handler = (request: Request): Promise<Response> => runner.then((handler) => handler(request))
197
184
  return { close, handler } as const
@@ -2,6 +2,7 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
  import type * as Cause from "effect/Cause"
5
+ import type * as Effect from "effect/Effect"
5
6
  import type * as Exit from "effect/Exit"
6
7
  import type * as FiberId from "effect/FiberId"
7
8
  import type * as Option from "effect/Option"
@@ -120,14 +121,17 @@ export const clientAbortFiberId: FiberId.FiberId = internal.clientAbortFiberId
120
121
  /**
121
122
  * @since 1.0.0
122
123
  */
123
- export const isClientAbortCause: <E>(cause: Cause.Cause<E>) => boolean = internal.isClientAbortCause
124
+ export const causeResponse: <E>(
125
+ cause: Cause.Cause<E>
126
+ ) => Effect.Effect<readonly [ServerResponse.HttpServerResponse, Cause.Cause<E>]> = internal.causeResponse
124
127
 
125
128
  /**
126
129
  * @since 1.0.0
127
130
  */
128
- export const causeStatusStripped: <E>(
131
+ export const causeResponseStripped: <E>(
129
132
  cause: Cause.Cause<E>
130
- ) => readonly [status: number, cause: Option.Option<Cause.Cause<E>>] = internal.causeStatusStripped
133
+ ) => readonly [response: ServerResponse.HttpServerResponse, cause: Option.Option<Cause.Cause<E>>] =
134
+ internal.causeResponseStripped
131
135
 
132
136
  /**
133
137
  * @since 1.0.0
@@ -28,7 +28,6 @@ export interface Respondable {
28
28
  export const isRespondable = (u: unknown): u is Respondable => hasProperty(u, symbol)
29
29
 
30
30
  const badRequest = ServerResponse.empty({ status: 400 })
31
- const internalServerError = () => ServerResponse.empty({ status: 500 })
32
31
 
33
32
  /**
34
33
  * @since 1.0.0
@@ -45,22 +44,14 @@ export const toResponse = (self: Respondable): Effect.Effect<HttpServerResponse>
45
44
  * @since 1.0.0
46
45
  * @category accessors
47
46
  */
48
- export const toResponseOrElse = (
49
- u: unknown,
50
- orElse: () => Effect.Effect<HttpServerResponse, unknown>
51
- ): Effect.Effect<HttpServerResponse, unknown> => {
52
- if (isRespondable(u)) {
53
- return u[symbol]()
47
+ export const toResponseOrElse = (u: unknown, orElse: HttpServerResponse): Effect.Effect<HttpServerResponse> => {
48
+ if (ServerResponse.isServerResponse(u)) {
49
+ return Effect.succeed(u)
50
+ } else if (isRespondable(u)) {
51
+ return Effect.catchAllCause(u[symbol](), () => Effect.succeed(orElse))
54
52
  // add support for some commmon types
55
53
  } else if (ParseResult.isParseError(u)) {
56
54
  return Effect.succeed(badRequest)
57
55
  }
58
- return orElse()
56
+ return Effect.succeed(orElse)
59
57
  }
60
-
61
- /**
62
- * @since 1.0.0
63
- * @category accessors
64
- */
65
- export const toResponseError = (u: unknown): Effect.Effect<HttpServerResponse, unknown> =>
66
- toResponseOrElse(u, internalServerError)
@@ -83,12 +83,12 @@ export const logger = make((httpApp) => {
83
83
  if (fiber.getFiberRef(loggerDisabled)) {
84
84
  return exit
85
85
  } else if (exit._tag === "Failure") {
86
- const [status, cause] = ServerError.causeStatusStripped(exit.cause)
86
+ const [response, cause] = ServerError.causeResponseStripped(exit.cause)
87
87
  return Effect.zipRight(
88
88
  Effect.annotateLogs(Effect.log(cause._tag === "Some" ? cause.value : "Sent HTTP Response"), {
89
89
  "http.method": request.method,
90
90
  "http.url": request.url,
91
- "http.status": status
91
+ "http.status": response.status
92
92
  }),
93
93
  exit
94
94
  )
@@ -1,10 +1,12 @@
1
1
  import * as Cause from "effect/Cause"
2
+ import * as Effect from "effect/Effect"
2
3
  import type * as Exit from "effect/Exit"
3
4
  import * as FiberId from "effect/FiberId"
4
5
  import { globalValue } from "effect/GlobalValue"
5
6
  import * as Option from "effect/Option"
6
7
  import * as Predicate from "effect/Predicate"
7
8
  import type * as Error from "../HttpServerError.js"
9
+ import * as Respondable from "../HttpServerRespondable.js"
8
10
  import type { HttpServerResponse } from "../HttpServerResponse.js"
9
11
  import * as internalServerResponse from "./httpServerResponse.js"
10
12
 
@@ -23,44 +25,67 @@ export const clientAbortFiberId = globalValue(
23
25
  )
24
26
 
25
27
  /** @internal */
26
- export const isClientAbortCause = <E>(cause: Cause.Cause<E>): boolean =>
27
- Cause.reduce(
28
+ export const causeResponse = <E>(
29
+ cause: Cause.Cause<E>
30
+ ): Effect.Effect<readonly [HttpServerResponse, Cause.Cause<E>]> => {
31
+ const [effect, stripped] = Cause.reduce(
28
32
  cause,
29
- false,
30
- (_, cause) => cause._tag === "Interrupt" && cause.fiberId === clientAbortFiberId ? Option.some(true) : Option.none()
33
+ [Effect.succeed(internalServerError), Cause.empty as Cause.Cause<E>] as const,
34
+ (acc, cause) => {
35
+ switch (cause._tag) {
36
+ case "Empty": {
37
+ return Option.some(acc)
38
+ }
39
+ case "Fail": {
40
+ return Option.some([Respondable.toResponseOrElse(cause.error, internalServerError), cause] as const)
41
+ }
42
+ case "Die": {
43
+ return Option.some([Respondable.toResponseOrElse(cause.defect, internalServerError), cause] as const)
44
+ }
45
+ case "Interrupt": {
46
+ if (acc[1]._tag !== "Empty") {
47
+ return Option.none()
48
+ }
49
+ const response = cause.fiberId === clientAbortFiberId ? clientAbortError : serverAbortError
50
+ return Option.some([Effect.succeed(response), cause] as const)
51
+ }
52
+ default: {
53
+ return Option.none()
54
+ }
55
+ }
56
+ }
31
57
  )
58
+ return Effect.map(effect, (response) => {
59
+ if (Cause.isEmptyType(stripped)) {
60
+ return [response, Cause.die(response)] as const
61
+ }
62
+ return [response, Cause.sequential(stripped, Cause.die(response))] as const
63
+ })
64
+ }
32
65
 
33
66
  /** @internal */
34
- export const causeStatusStripped = <E>(
67
+ export const causeResponseStripped = <E>(
35
68
  cause: Cause.Cause<E>
36
- ): readonly [status: number, cause: Option.Option<Cause.Cause<E>>] => {
37
- if (Cause.isInterruptedOnly(cause)) {
38
- return [isClientAbortCause(cause) ? 499 : 503, Option.some(cause)]
39
- }
69
+ ): readonly [response: HttpServerResponse, cause: Option.Option<Cause.Cause<E>>] => {
40
70
  let response: HttpServerResponse | undefined
41
71
  const stripped = Cause.stripSomeDefects(cause, (defect) => {
42
72
  if (internalServerResponse.isServerResponse(defect)) {
43
73
  response = defect
44
- return Option.some(Cause.die(defect))
74
+ return Option.some(Cause.empty)
45
75
  }
46
76
  return Option.none()
47
77
  })
48
- return [response?.status ?? 500, stripped]
78
+ return [response ?? internalServerError, stripped]
49
79
  }
50
80
 
51
81
  const internalServerError = internalServerResponse.empty({ status: 500 })
82
+ const clientAbortError = internalServerResponse.empty({ status: 499 })
83
+ const serverAbortError = internalServerResponse.empty({ status: 503 })
52
84
 
53
85
  /** @internal */
54
86
  export const exitResponse = <E>(exit: Exit.Exit<HttpServerResponse, E>): HttpServerResponse => {
55
87
  if (exit._tag === "Success") {
56
88
  return exit.value
57
89
  }
58
- return Cause.reduce(
59
- exit.cause,
60
- internalServerError,
61
- (_, cause) =>
62
- cause._tag === "Die" && internalServerResponse.isServerResponse(cause.defect)
63
- ? Option.some(cause.defect)
64
- : Option.none()
65
- )
90
+ return causeResponseStripped(exit.cause)[0]
66
91
  }