@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.
- package/dist/cjs/Command.js +3 -26
- package/dist/cjs/Command.js.map +1 -1
- package/dist/cjs/CommandExecutor.js +3 -26
- package/dist/cjs/CommandExecutor.js.map +1 -1
- package/dist/cjs/Cookies.js +11 -34
- package/dist/cjs/Cookies.js.map +1 -1
- package/dist/cjs/Effectify.js +3 -26
- package/dist/cjs/Effectify.js.map +1 -1
- package/dist/cjs/Error.js +5 -28
- package/dist/cjs/Error.js.map +1 -1
- package/dist/cjs/Etag.js +3 -26
- package/dist/cjs/Etag.js.map +1 -1
- package/dist/cjs/FileSystem.js +6 -29
- package/dist/cjs/FileSystem.js.map +1 -1
- package/dist/cjs/Headers.js +10 -33
- package/dist/cjs/Headers.js.map +1 -1
- package/dist/cjs/HttpApp.js +33 -89
- package/dist/cjs/HttpApp.js.map +1 -1
- package/dist/cjs/HttpBody.js +4 -27
- package/dist/cjs/HttpBody.js.map +1 -1
- package/dist/cjs/HttpClient.js +3 -26
- package/dist/cjs/HttpClient.js.map +1 -1
- package/dist/cjs/HttpClientError.js +4 -27
- package/dist/cjs/HttpClientError.js.map +1 -1
- package/dist/cjs/HttpClientRequest.js +3 -26
- package/dist/cjs/HttpClientRequest.js.map +1 -1
- package/dist/cjs/HttpClientResponse.js +4 -27
- package/dist/cjs/HttpClientResponse.js.map +1 -1
- package/dist/cjs/HttpIncomingMessage.js +9 -32
- package/dist/cjs/HttpIncomingMessage.js.map +1 -1
- package/dist/cjs/HttpMiddleware.js +3 -26
- package/dist/cjs/HttpMiddleware.js.map +1 -1
- package/dist/cjs/HttpMultiplex.js +3 -26
- package/dist/cjs/HttpMultiplex.js.map +1 -1
- package/dist/cjs/HttpPlatform.js +3 -26
- package/dist/cjs/HttpPlatform.js.map +1 -1
- package/dist/cjs/HttpRouter.js +3 -26
- package/dist/cjs/HttpRouter.js.map +1 -1
- package/dist/cjs/HttpServer.js +3 -26
- package/dist/cjs/HttpServer.js.map +1 -1
- package/dist/cjs/HttpServerError.js +9 -32
- package/dist/cjs/HttpServerError.js.map +1 -1
- package/dist/cjs/HttpServerRequest.js +4 -27
- package/dist/cjs/HttpServerRequest.js.map +1 -1
- package/dist/cjs/HttpServerRespondable.js +12 -42
- package/dist/cjs/HttpServerRespondable.js.map +1 -1
- package/dist/cjs/HttpServerResponse.js +3 -26
- package/dist/cjs/HttpServerResponse.js.map +1 -1
- package/dist/cjs/HttpTraceContext.js +5 -28
- package/dist/cjs/HttpTraceContext.js.map +1 -1
- package/dist/cjs/KeyValueStore.js +3 -26
- package/dist/cjs/KeyValueStore.js.map +1 -1
- package/dist/cjs/Multipart.js +3 -26
- package/dist/cjs/Multipart.js.map +1 -1
- package/dist/cjs/Path.js +3 -26
- package/dist/cjs/Path.js.map +1 -1
- package/dist/cjs/PlatformConfigProvider.js +16 -39
- package/dist/cjs/PlatformConfigProvider.js.map +1 -1
- package/dist/cjs/PlatformLogger.js +3 -26
- package/dist/cjs/PlatformLogger.js.map +1 -1
- package/dist/cjs/Runtime.js +4 -27
- package/dist/cjs/Runtime.js.map +1 -1
- package/dist/cjs/Socket.js +18 -41
- package/dist/cjs/Socket.js.map +1 -1
- package/dist/cjs/Template.js +6 -29
- package/dist/cjs/Template.js.map +1 -1
- package/dist/cjs/Terminal.js +4 -27
- package/dist/cjs/Terminal.js.map +1 -1
- package/dist/cjs/Transferable.js +8 -31
- package/dist/cjs/Transferable.js.map +1 -1
- package/dist/cjs/UrlParams.js +7 -30
- package/dist/cjs/UrlParams.js.map +1 -1
- package/dist/cjs/Worker.js +3 -26
- package/dist/cjs/Worker.js.map +1 -1
- package/dist/cjs/WorkerError.js +5 -28
- package/dist/cjs/WorkerError.js.map +1 -1
- package/dist/cjs/WorkerRunner.js +3 -26
- package/dist/cjs/WorkerRunner.js.map +1 -1
- package/dist/cjs/index.js +42 -65
- package/dist/cjs/internal/command.js +11 -34
- package/dist/cjs/internal/command.js.map +1 -1
- package/dist/cjs/internal/commandExecutor.js +9 -32
- package/dist/cjs/internal/commandExecutor.js.map +1 -1
- package/dist/cjs/internal/effectify.js +3 -26
- package/dist/cjs/internal/effectify.js.map +1 -1
- package/dist/cjs/internal/error.js +3 -26
- package/dist/cjs/internal/error.js.map +1 -1
- package/dist/cjs/internal/etag.js +3 -26
- package/dist/cjs/internal/etag.js.map +1 -1
- package/dist/cjs/internal/fileSystem.js +12 -35
- package/dist/cjs/internal/fileSystem.js.map +1 -1
- package/dist/cjs/internal/httpBody.js +10 -33
- package/dist/cjs/internal/httpBody.js.map +1 -1
- package/dist/cjs/internal/httpClient.js +23 -46
- package/dist/cjs/internal/httpClient.js.map +1 -1
- package/dist/cjs/internal/httpClientRequest.js +11 -34
- package/dist/cjs/internal/httpClientRequest.js.map +1 -1
- package/dist/cjs/internal/httpClientResponse.js +13 -36
- package/dist/cjs/internal/httpClientResponse.js.map +1 -1
- package/dist/cjs/internal/httpMiddleware.js +16 -39
- package/dist/cjs/internal/httpMiddleware.js.map +1 -1
- package/dist/cjs/internal/httpMultiplex.js +9 -32
- package/dist/cjs/internal/httpMultiplex.js.map +1 -1
- package/dist/cjs/internal/httpPlatform.js +8 -31
- package/dist/cjs/internal/httpPlatform.js.map +1 -1
- package/dist/cjs/internal/httpRouter.js +18 -41
- package/dist/cjs/internal/httpRouter.js.map +1 -1
- package/dist/cjs/internal/httpServer.js +6 -29
- package/dist/cjs/internal/httpServer.js.map +1 -1
- package/dist/cjs/internal/httpServerError.js +59 -42
- package/dist/cjs/internal/httpServerError.js.map +1 -1
- package/dist/cjs/internal/httpServerRequest.js +16 -39
- package/dist/cjs/internal/httpServerRequest.js.map +1 -1
- package/dist/cjs/internal/httpServerResponse.js +13 -36
- package/dist/cjs/internal/httpServerResponse.js.map +1 -1
- package/dist/cjs/internal/keyValueStore.js +11 -34
- package/dist/cjs/internal/keyValueStore.js.map +1 -1
- package/dist/cjs/internal/multipart.js +20 -43
- package/dist/cjs/internal/multipart.js.map +1 -1
- package/dist/cjs/internal/path.js +9 -36
- package/dist/cjs/internal/path.js.map +1 -1
- package/dist/cjs/internal/platformLogger.js +6 -29
- package/dist/cjs/internal/platformLogger.js.map +1 -1
- package/dist/cjs/internal/terminal.js +1 -1
- package/dist/cjs/internal/terminal.js.map +1 -1
- package/dist/cjs/internal/worker.js +23 -46
- package/dist/cjs/internal/worker.js.map +1 -1
- package/dist/cjs/internal/workerRunner.js +20 -43
- package/dist/cjs/internal/workerRunner.js.map +1 -1
- package/dist/dts/HttpApp.d.ts +4 -5
- package/dist/dts/HttpApp.d.ts.map +1 -1
- package/dist/dts/HttpServerError.d.ts +3 -2
- package/dist/dts/HttpServerError.d.ts.map +1 -1
- package/dist/dts/HttpServerRespondable.d.ts +1 -6
- package/dist/dts/HttpServerRespondable.d.ts.map +1 -1
- package/dist/esm/HttpApp.js +17 -50
- package/dist/esm/HttpApp.js.map +1 -1
- package/dist/esm/HttpServerError.js +2 -2
- package/dist/esm/HttpServerError.js.map +1 -1
- package/dist/esm/HttpServerRespondable.js +5 -11
- package/dist/esm/HttpServerRespondable.js.map +1 -1
- package/dist/esm/internal/httpMiddleware.js +2 -2
- package/dist/esm/internal/httpMiddleware.js.map +1 -1
- package/dist/esm/internal/httpServerError.js +48 -8
- package/dist/esm/internal/httpServerError.js.map +1 -1
- package/package.json +3 -3
- package/src/HttpApp.ts +47 -60
- package/src/HttpServerError.ts +7 -3
- package/src/HttpServerRespondable.ts +6 -15
- package/src/internal/httpMiddleware.ts +2 -2
- 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
|
-
|
|
45
|
-
) => Effect.Effect<_,
|
|
42
|
+
response: ServerResponse.HttpServerResponse
|
|
43
|
+
) => Effect.Effect<_, EH, RH>,
|
|
46
44
|
middleware?: HttpMiddleware | undefined
|
|
47
|
-
):
|
|
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
|
|
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(
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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>(
|
|
179
|
-
|
|
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
|
package/src/HttpServerError.ts
CHANGED
|
@@ -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
|
|
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
|
|
131
|
+
export const causeResponseStripped: <E>(
|
|
129
132
|
cause: Cause.Cause<E>
|
|
130
|
-
) => readonly [
|
|
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
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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 [
|
|
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
|
|
27
|
-
Cause.
|
|
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
|
-
|
|
30
|
-
(
|
|
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
|
|
67
|
+
export const causeResponseStripped = <E>(
|
|
35
68
|
cause: Cause.Cause<E>
|
|
36
|
-
): readonly [
|
|
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.
|
|
74
|
+
return Option.some(Cause.empty)
|
|
45
75
|
}
|
|
46
76
|
return Option.none()
|
|
47
77
|
})
|
|
48
|
-
return [response
|
|
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
|
|
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
|
}
|