def recv.loop

bend-kit-websocket@0.4.0.0 · websocket.bend:1043

import bend-kit-websocket@0.4.0.0/websocket.bend as Websocket
import Base
import bend-kit-bytes@0.3.3.0/bytes.bend as Bytes

1043def recv.loop(n: Nat, h: Step, +tls: Bool, +server: Bool, +max: U32, +closing: Bool, +ms: U32) -> IO(Conn & Result<&1, &1, U32 & String, Incoming>):
1044  match n:
1045    case 0n:
1046      recv.stuck(h, tls, server, max)
1047    case 1n+p:
1048      match h:
1049        case Parse{sock, input, partial}:
1050          recv.loop(p, Decoded{sock, partial, parse(server, max, input)}, tls, server, max, closing, ms)
1051        case Decoded{sock, partial, d}:
1052          match d:
1053            case Need{input}:
1054              do IO<Conn & Result<&1, &1, U32 & String, Incoming>>:
1055                r : Socket & Result<&1, &1, U32 & String, U32 & Array<U32>> <- io.recv(tls, sock, ms)
1056                recv.loop(p, Read{r, input, partial}, tls, server, max, closing, ms)
1057            case Bad{+code, why}:
1058              recv.fail(sock, tls, server, max, (code, why))
1059            case Got{f, rest}:
1060              recv.loop(p, Fed{sock, rest, feed(partial, f, max)}, tls, server, max, closing, ms)
1061        case Fed{sock, rest, r}:
1062          match r:
1063            case Fail{e}:
1064              recv.fail(sock, tls, server, max, e)
1065            case Done{(partial, ev)}:
1066              match ev:
1067                case More{}:
1068                  recv.loop(p, Parse{sock, rest, partial}, tls, server, max, closing, ms)
1069                case Message{1, d}:
1070                  recv.out(sock, tls, server, rest, partial, max, closing, Done{TextMessage{d}})
1071                case Message{op, d}:
1072                  recv.out(sock, tls, server, rest, partial, max, closing, Done{Binary{d}})
1073                case Control{9, d}:
1074                  do IO<Conn & Result<&1, &1, U32 & String, Incoming>>:
1075                    s : Socket & Result<&1, &1, U32 & String, Unit> <- raw(server, sock, tls, True{}, 10, d)
1076                    recv.loop(p, Ponged{s, rest, partial}, tls, server, max, closing, ms)
1077                case Control{10, d}:
1078                  recv.out(sock, tls, server, rest, partial, max, closing, Done{Pong{d}})
1079                case Control{op, d}:
1080                  recv.closed(close.parse(d), sock, tls, server, rest, partial, max, closing)
1081        case Read{r, input, partial}:
1082          match r:
1083            case (sock, Fail{e}):
1084              recv.out(sock, tls, server, input, partial, max, closing, Fail{e})
1085            case (sock, Done{(0, buf)}):
1086              recv.out(sock, tls, server, input, partial, max, closing, Fail{(1006, "connection closed without a close frame")})
1087            case (sock, Done{(+len, buf)}):
1088              recv.loop(p, Parse{sock, push(input, Bytes.Bytes{len, buf}), partial}, tls, server, max, closing, ms)
1089        case Ponged{r, input, partial}:
1090          match r:
1091            case (sock, Fail{e}):
1092              recv.out(sock, tls, server, input, partial, max, closing, Fail{e})
1093            case (sock, Done{u}):
1094              recv.loop(p, Parse{sock, input, partial}, tls, server, max, closing, ms)

Uses (30)

Used by (1)