()
| 444 | } |
| 445 | |
| 446 | get upgrade(): Effect.Effect<Socket.Socket, Error.HttpServerError> { |
| 447 | return Effect.flatMap( |
| 448 | Effect.try({ |
| 449 | try: () => Deno.upgradeWebSocket(this.source, this.websocketOptions), |
| 450 | catch: (cause) => |
| 451 | new Error.HttpServerError({ |
| 452 | reason: new Error.RequestParseError({ |
| 453 | request: this, |
| 454 | cause, |
| 455 | description: "Not an upgradeable ServerRequest" |
| 456 | }) |
| 457 | }) |
| 458 | }), |
| 459 | (upgrade) => { |
| 460 | const buffered: Array<MessageEvent> = [] |
| 461 | const buffer = (event: MessageEvent) => buffered.push(event) |
| 462 | upgrade.socket.addEventListener("message", buffer) |
| 463 | this.upgraded = true |
| 464 | this.resolve(upgrade.response) |
| 465 | |
| 466 | return Effect.callback<Socket.Socket, Error.HttpServerError>((resume) => { |
| 467 | const cleanup = () => { |
| 468 | upgrade.socket.removeEventListener("open", onOpen) |
| 469 | upgrade.socket.removeEventListener("error", onFailure) |
| 470 | upgrade.socket.removeEventListener("close", onFailure) |
| 471 | } |
| 472 | const onFailure = (cause: Event) => { |
| 473 | cleanup() |
| 474 | upgrade.socket.removeEventListener("message", buffer) |
| 475 | buffered.length = 0 |
| 476 | resume(Effect.fail( |
| 477 | new Error.HttpServerError({ |
| 478 | reason: new Error.RequestParseError({ |
| 479 | request: this, |
| 480 | cause, |
| 481 | description: "WebSocket upgrade failed before open" |
| 482 | }) |
| 483 | }) |
| 484 | )) |
| 485 | } |
| 486 | const onOpen = () => { |
| 487 | cleanup() |
| 488 | resume(Socket.fromWebSocket( |
| 489 | Effect.acquireRelease( |
| 490 | Effect.succeed(upgrade.socket), |
| 491 | (socket) => Effect.sync(() => socket.close(1000)) |
| 492 | ), |
| 493 | { |
| 494 | onInitialRun: (socket) => { |
| 495 | socket.removeEventListener("message", buffer) |
| 496 | return buffered.splice(0) |
| 497 | } |
| 498 | } |
| 499 | )) |
| 500 | } |
| 501 | upgrade.socket.addEventListener("open", onOpen, { once: true }) |
| 502 | upgrade.socket.addEventListener("error", onFailure, { once: true }) |
| 503 | upgrade.socket.addEventListener("close", onFailure, { once: true }) |
nothing calls this directly
no test coverage detected