(packet: Packet)
| 190 | } |
| 191 | |
| 192 | async #handlePacket(packet: Packet): Promise<void> { |
| 193 | const parsedPacket = Packet.safeParse(packet); |
| 194 | |
| 195 | if (!parsedPacket.success) { |
| 196 | // console.error("dropping invalid packet", packet); |
| 197 | return; |
| 198 | } |
| 199 | |
| 200 | // console.log("<-", packet); |
| 201 | |
| 202 | switch (parsedPacket.data.type) { |
| 203 | case "ACK": { |
| 204 | // Check our list of ACKs and resolve with the message |
| 205 | const ack = this.#acks.get(parsedPacket.data.id); |
| 206 | |
| 207 | if (!ack) { |
| 208 | return; |
| 209 | } |
| 210 | |
| 211 | clearTimeout(ack.timeout); |
| 212 | ack.resolve(parsedPacket.data.message); |
| 213 | |
| 214 | break; |
| 215 | } |
| 216 | case "CONNECT": { |
| 217 | if (!parsedPacket.data.sessionId) { |
| 218 | // This is a client trying to connect, so we generate and send back a session ID |
| 219 | const id = randomUUID(); |
| 220 | |
| 221 | await this.#sendPacket({ type: "CONNECT", sessionId: id }); |
| 222 | |
| 223 | return; |
| 224 | } |
| 225 | |
| 226 | // This is a server replying to our connect message |
| 227 | if (this.#sessionId) { |
| 228 | // We're already connected |
| 229 | return; |
| 230 | } |
| 231 | |
| 232 | this.#sessionId = parsedPacket.data.sessionId; |
| 233 | |
| 234 | break; |
| 235 | } |
| 236 | case "EVENT": { |
| 237 | const result = await this.#handler.handleMessage(parsedPacket.data.message); |
| 238 | |
| 239 | if (typeof parsedPacket.data.id === "undefined") { |
| 240 | return; |
| 241 | } |
| 242 | |
| 243 | // There's an ID so we should ACK |
| 244 | await this.#sendPacket({ |
| 245 | type: "ACK", |
| 246 | id: parsedPacket.data.id, |
| 247 | message: result, |
| 248 | }); |
| 249 |
no test coverage detected