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)