(
requestFiber: Fiber.RuntimeFiber<any, any>,
client: Client,
request: Request<Rpcs>
)
| 216 | } |
| 217 | |
| 218 | const handleRequest = ( |
| 219 | requestFiber: Fiber.RuntimeFiber<any, any>, |
| 220 | client: Client, |
| 221 | request: Request<Rpcs> |
| 222 | ): Effect.Effect<void> => { |
| 223 | if (client.fibers.has(request.id)) { |
| 224 | return Effect.flatMap( |
| 225 | Fiber.await(client.fibers.get(request.id)!), |
| 226 | () => handleRequest(requestFiber, client, request) |
| 227 | ) |
| 228 | } |
| 229 | const rpc = group.requests.get(request.tag) as any as Rpc.AnyWithProps |
| 230 | const entry = context.unsafeMap.get(rpc?.key) as Rpc.Handler<Rpcs["_tag"]> |
| 231 | if (!rpc || !entry) { |
| 232 | const write = Effect.catchAllDefect( |
| 233 | options.onFromServer({ |
| 234 | _tag: "Exit", |
| 235 | clientId: client.id, |
| 236 | requestId: request.id, |
| 237 | exit: Exit.die(`Unknown request tag: ${request.tag}`) |
| 238 | }), |
| 239 | (defect) => sendDefect(client, defect) |
| 240 | ) |
| 241 | if (!client.ended || client.fibers.size > 0) return write |
| 242 | return Effect.zipRight(write, endClient(client)) |
| 243 | } |
| 244 | const isStream = RpcSchema.isStreamSchema(rpc.successSchema) |
| 245 | const result = entry.handler(request.payload, { |
| 246 | clientId: client.id, |
| 247 | headers: request.headers |
| 248 | }) |
| 249 | |
| 250 | // if the handler requested forking, then we skip the concurrency control |
| 251 | const isWrapper = Rpc.isWrapper(result) |
| 252 | const isFork = isWrapper && result.fork |
| 253 | const isUninterruptible = isWrapper && result.uninterruptible |
| 254 | // unwrap the fork data type |
| 255 | const streamOrEffect = isWrapper ? result.value : result |
| 256 | const handler = applyMiddleware( |
| 257 | rpc, |
| 258 | context, |
| 259 | client.id, |
| 260 | request.payload, |
| 261 | request.headers, |
| 262 | isStream |
| 263 | ? streamEffect(client, request, streamOrEffect) |
| 264 | : streamOrEffect as Effect.Effect<any> |
| 265 | ) |
| 266 | let responded = false |
| 267 | let effect = Effect.matchCauseEffect( |
| 268 | isUninterruptible ? handler : Effect.interruptible(handler), |
| 269 | { |
| 270 | onSuccess: (value) => { |
| 271 | responded = true |
| 272 | return options.onFromServer({ |
| 273 | _tag: "Exit", |
| 274 | clientId: client.id, |
| 275 | requestId: request.id, |
no test coverage detected
searching dependent graphs…