MCPcopy Create free account
hub / github.com/Effect-TS/effect / upgrade

Method upgrade

packages/platform/deno/src/DenoHttpServer.ts:446–513  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

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 })

Callers

nothing calls this directly

Calls 5

removeEventListenerMethod · 0.80
addEventListenerMethod · 0.65
closeMethod · 0.65
cleanupFunction · 0.50
syncMethod · 0.45

Tested by

no test coverage detected