(clientId: number, message: FromClient<Rpcs>)
| 157 | }) |
| 158 | |
| 159 | const write = (clientId: number, message: FromClient<Rpcs>): Effect.Effect<void> => |
| 160 | Effect.catchAllDefect( |
| 161 | Effect.withFiberRuntime((requestFiber) => { |
| 162 | if (isShutdown) return Effect.interrupt |
| 163 | let client = clients.get(clientId) |
| 164 | if (!client) { |
| 165 | client = { |
| 166 | id: clientId, |
| 167 | latches: new Map(), |
| 168 | fibers: new Map(), |
| 169 | ended: false |
| 170 | } |
| 171 | clients.set(clientId, client) |
| 172 | } else if (client.ended) { |
| 173 | return Effect.interrupt |
| 174 | } |
| 175 | |
| 176 | switch (message._tag) { |
| 177 | case "Request": { |
| 178 | return handleRequest(requestFiber, client, message) |
| 179 | } |
| 180 | case "Ack": { |
| 181 | const latch = client.latches.get(message.requestId) |
| 182 | return latch ? latch.open : Effect.void |
| 183 | } |
| 184 | case "Interrupt": { |
| 185 | const fiber = client.fibers.get(message.requestId) |
| 186 | return fiber ? Fiber.interruptAsFork(fiber, fiberIdClientInterrupt) : options.onFromServer({ |
| 187 | _tag: "Exit", |
| 188 | clientId, |
| 189 | requestId: message.requestId, |
| 190 | exit: Exit.interrupt(FiberId.none) |
| 191 | }) |
| 192 | } |
| 193 | case "Eof": { |
| 194 | client.ended = true |
| 195 | if (client.fibers.size > 0) return Effect.void |
| 196 | return endClient(client) |
| 197 | } |
| 198 | default: { |
| 199 | return sendDefect(client, `Unknown request tag: ${(message as any)._tag}`) |
| 200 | } |
| 201 | } |
| 202 | }), |
| 203 | (defect) => sendDefect(clients.get(clientId)!, defect) |
| 204 | ) |
| 205 | |
| 206 | const endClient = (client: Client) => { |
| 207 | clients.delete(client.id) |
no test coverage detected
searching dependent graphs…