MCPcopy
hub / github.com/Effect-TS/effect / handleRequest

Function handleRequest

packages/rpc/src/RpcServer.ts:218–354  ·  view source on GitHub ↗
(
    requestFiber: Fiber.RuntimeFiber<any, any>,
    client: Client,
    request: Request<Rpcs>
  )

Source from the content-addressed store, hash-verified

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,

Callers 1

writeFunction · 0.70

Calls 15

sendDefectFunction · 0.85
endClientFunction · 0.85
streamEffectFunction · 0.85
StringInterface · 0.85
isInterruptedMethod · 0.80
failCauseMethod · 0.80
mergeMethod · 0.80
applyMiddlewareFunction · 0.70
getMethod · 0.65
dieMethod · 0.65
makeMethod · 0.65
getFiberRefsMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…