| 324 | * @category conversions |
| 325 | */ |
| 326 | export const fromWebHandler = ( |
| 327 | handler: (request: Request) => Promise<Response> |
| 328 | ): Default<ServerError.HttpServerError> => |
| 329 | Effect.async((resume, signal) => { |
| 330 | const fiber = Option.getOrThrow(Fiber.getCurrentFiber()) |
| 331 | const request = Context.unsafeGet(fiber.currentContext, ServerRequest.HttpServerRequest) |
| 332 | const requestResult = ServerRequest.toWebEither(request, { |
| 333 | signal, |
| 334 | runtime: Runtime.make({ |
| 335 | context: fiber.currentContext, |
| 336 | fiberRefs: fiber.getFiberRefs(), |
| 337 | runtimeFlags: Runtime.defaultRuntimeFlags |
| 338 | }) |
| 339 | }) |
| 340 | if (requestResult._tag === "Left") { |
| 341 | return resume(Effect.fail(requestResult.left)) |
| 342 | } |
| 343 | handler(requestResult.right).then( |
| 344 | (response) => resume(Effect.succeed(ServerResponse.fromWeb(response))), |
| 345 | (cause) => |
| 346 | resume(Effect.fail( |
| 347 | new ServerError.RequestError({ |
| 348 | cause, |
| 349 | request, |
| 350 | reason: "Transport", |
| 351 | description: "HttpApp.fromWebHandler: Error in handler" |
| 352 | }) |
| 353 | )) |
| 354 | ) |
| 355 | }) |